package controllers

import (
	"encoding/json"
	"strconv"
	"supershare/backend/models"
	"time"

	"github.com/beego/beego/v2/server/web"
)

// MemberCardController 会员卡控制器
type MemberCardController struct {
	web.Controller
}

// List 获取会员卡列表
func (c *MemberCardController) List() {
	// 检查权限
	permResult := CheckControllerPermission(c.Ctx)
	if !permResult.Success {
		RespondWithError(&c.Controller, permResult)
		return
	}

	// 获取分页参数
	page, _ := c.GetInt("page", 1)
	pageSize, _ := c.GetInt("pageSize", 10)

	// 获取过滤参数
	filters := make(map[string]interface{})

	// 关键词搜索
	if keyword := c.GetString("keyword"); keyword != "" {
		filters["keyword"] = keyword
	}

	// 会员等级过滤
	if levelId, err := c.GetInt("levelId"); err == nil && levelId > 0 {
		filters["levelId"] = levelId
	}

	// 状态过滤
	if status, _ := c.GetInt("status", -1); status >= 0 {
		filters["status"] = status
	}

	// 创建时间范围过滤
	if startTime, _ := c.GetInt("startTime", -1); startTime >= 0 {
		filters["startTime"] = startTime
	}
	if endTime, _ := c.GetInt("endTime", -1); endTime >= 0 {
		filters["endTime"] = endTime
	}

	// 加盟商权限过滤 - 非总部管理员只能查看自己加盟商的会员卡
	if permResult.Admin.FranchiseId > 0 {
		filters["franchiseId"] = permResult.Admin.FranchiseId
	}

	// 获取会员卡列表
	cards, total, err := models.GetMemberCardList(page, pageSize, filters)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "获取会员卡列表失败: " + err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"data": map[string]interface{}{
			"list":  cards,
			"total": total,
			"page":  page,
		},
	}
	c.ServeJSON()
}

// GetOne 获取会员卡详情
func (c *MemberCardController) GetOne() {
	// 检查权限
	permResult := CheckControllerPermission(c.Ctx)
	if !permResult.Success {
		RespondWithError(&c.Controller, permResult)
		return
	}

	// 获取ID参数
	idStr := c.Ctx.Input.Param(":id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "无效的会员卡ID",
		}
		c.ServeJSON()
		return
	}

	// 获取会员卡详情（使用带加盟商权限过滤的方法）
	card, err := models.GetMemberCardByIdWithFranchise(id, permResult.Admin.FranchiseId)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "获取会员卡详情失败: " + err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"data":    card,
	}
	c.ServeJSON()
}

// Create 创建会员卡
func (c *MemberCardController) Create() {
	// 检查权限
	permResult := CheckControllerPermission(c.Ctx)
	if !permResult.Success {
		RespondWithError(&c.Controller, permResult)
		return
	}

	// 解析请求数据
	var card models.MemberCard
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &card)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "无效的请求数据: " + err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 如果没有设置到期日期，根据有效期计算
	if card.ValidityPeriod > 0 {
		card.ExpiryDate = time.Now().AddDate(0, card.ValidityPeriod, 0).Unix()
	}

	// 设置加盟商ID和创建者信息
	card.FranchiseId = permResult.Admin.FranchiseId
	card.UpdatedBy = permResult.Admin.Username
	card.CreatedBy = permResult.Admin.Username
	card.BeforeInsert()

	// 创建会员卡
	id, err := models.CreateMemberCard(&card)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "创建会员卡失败: " + err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"message": "创建会员卡成功",
		"data": map[string]interface{}{
			"id": id,
		},
	}
	c.ServeJSON()
}

// Update 更新会员卡
func (c *MemberCardController) Update() {
	// 检查权限
	permResult := CheckControllerPermission(c.Ctx)
	if !permResult.Success {
		RespondWithError(&c.Controller, permResult)
		return
	}

	// 解析请求数据
	var requestData models.MemberCard
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &requestData)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "无效的请求数据: " + err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 获取现有会员卡（使用带加盟商权限过滤的方法）
	card, err := models.GetMemberCardByIdWithFranchise(requestData.Id, permResult.Admin.FranchiseId)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "会员卡不存在或无权访问: " + err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 更新会员卡信息
	card.MemberId = requestData.MemberId
	card.CardNo = requestData.CardNo
	card.LevelId = requestData.LevelId
	card.ValidityPeriod = requestData.ValidityPeriod
	card.Status = requestData.Status
	card.Remark = requestData.Remark

	// 处理到期日期
	if card.ValidityPeriod > 0 {
		// 如果没有设置到期日期，根据有效期计算
		card.ExpiryDate = time.Now().AddDate(0, card.ValidityPeriod, 0).Unix()
	}

	// 设置更新者信息
	card.UpdatedBy = permResult.Admin.Username
	card.BeforeUpdate()

	// 更新会员卡（使用带加盟商权限过滤的方法）
	err = models.UpdateMemberCardWithFranchise(card, permResult.Admin.FranchiseId)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "更新会员卡失败: " + err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"message": "更新会员卡成功",
	}
	c.ServeJSON()
}

// Delete 删除会员卡
func (c *MemberCardController) Delete() {
	// 检查权限
	permResult := CheckControllerPermission(c.Ctx)
	if !permResult.Success {
		RespondWithError(&c.Controller, permResult)
		return
	}

	// 获取ID参数
	idStr := c.Ctx.Input.Param(":id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "无效的会员卡ID",
		}
		c.ServeJSON()
		return
	}

	// 删除会员卡（使用带加盟商权限过滤的方法）
	err = models.DeleteMemberCardWithFranchise(id, permResult.Admin.FranchiseId)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "会员卡不存在或无权删除: " + err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"message": "删除会员卡成功",
	}
	c.ServeJSON()
}
